# 女朋友
# 1、ai得知道他是你的女朋友 langchain中提示词模块来限定
#    女朋友的性格和类型由用户选择
# 2、ai还能能记住用户和它聊天的记录
#    langchain的memory记忆模块来实现
# 3、需要使用langchain的chain链，链把提示词+模型+记忆连接起来
# 构建我们的提示词，通过提示词来给大模型定义规则
import streamlit as st
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory # 在内存中保存历史记忆的模块
from langchain.chains import ConversationChain
import base64
import data.data as dd



user_id = st.session_state.user_id

#页面设计
#页面设计会发光的字体
st.write("""
<style>
.neon-glow {
    font-size: 50px;
    color: #fff;
    text-shadow: 0 0 10px #FFBBFF, 0 0 20px #FFBBFF, 0 0 30px #FFBBFF, 0 0 40px #FFBBFF, 0 0 70px #FFBBFF, 0 0 80px #FFBBFF, 0 0 100px #FFBBFF, 0 0 150px #FFBBFF;
    animation: glow 1s ease-in-out infinite alternate-reverse;
}

@keyframes glow {
    to {
        text-shadow: 0 0 5px #FFBBFF, 0 0 10px #FFBBFF, 0 0 15px #FFBBFF, 0 0 20px #FFBBFF, 0 0 35px #FFBBFF, 0 0 40px #FFBBFF, 0 0 50px #FFBBFF, 0 0 75px #FFBBFF;
    }
}
</style>
""", unsafe_allow_html=True)
st.markdown('<p class="neon-glow">😘😘长腿欧巴男友😘😘</p >', unsafe_allow_html=True)
st.subheader("😕😕😕有你就够了，需要什么男朋友😕😕😕")
#页面设计背景图片
def main_bg(main_bg):
    main_bg_ext = "jpg"
    st.markdown(
        f"""
         <style>
         .stApp {{
             background: url(data:image/{main_bg_ext};base64,{base64.b64encode(open(main_bg, "rb").read()).decode()});
             background-size: cover
         }}
         </style>
         """,
        unsafe_allow_html=True)
main_bg('login.jpg')

#实现存储功能



# 构建的大模型
llm = ChatOpenAI(
    model="glm-4-0520",
    api_key="86e7d82dc55dcd659a946763631ec9d6.SFA6yoqe7uCwsIRk",
    temperature=0.99,
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)
# 构建记忆模块
if "memory" not in st.session_state:
    st.session_state.memory = ConversationBufferMemory()

# 通过链把三个模块给连接起来
# ConversationChain链之所以能所以历史记忆存储，主要是因为会做一件事情，会把memory记忆模块中的数据以history参数名的形式
# 封装到链的PromptTemplate提示词模板当中
temp = "现在你要扮演一个男朋友的角色，你的性格是"+st.session_state.xingge+"，你只需要回答你女朋友的话即可，不需要重复用户的话，也不需要将你的角色和性格进行展示。你的女朋友说的话是:{input},你们的以前的对话是{history}"
prompt = PromptTemplate(
    input_variables=["input","history"],
    template=temp

)


chain = ConversationChain(
    prompt=prompt,
    llm=llm,
    memory=st.session_state.memory
)

input = st.chat_input("和你的男友说点话吧")
if input:
    with st.chat_message("user"):
        st.write(input)
    # 调用大模型回答我们的问题
    dd.add_chat_message_from_cbby(user_id,input, "user")
    result = chain.invoke(input)
    # 带有记忆的链result中没有content,
    with st.chat_message("assistant"):
        st.write(result["response"])
    dd.add_chat_message_from_cbby(user_id, result["response"], "assistant")


#按钮
col1,col2= st.columns([1,1])
with col1:
    bt3 = st.button("历史记录")
    if bt3:
        history = dd.query_message_by_user_id_from_cbby(user_id=user_id)
        if history:
            for msg in history:
                with st.chat_message(msg["role"]):
                    st.write(msg["message"])
        else:
            with st.chat_message("assistant"):
                st.write("我是你的长腿欧巴男友love you")

with col2:
    bt3 = st.button("创建一个新的会话")
    if bt3:
        st.switch_page("pages/cyber_boyfriend_selecct.py")
